#include "searchmanager.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

// 检查 reply 是否有效
static bool checkReply(QNetworkReply* reply)
{
    if(reply == nullptr)
    {
        qDebug() << "reply 为空";
        return false;
    }
    if (reply->error() != QNetworkReply::NoError)
    {
        qDebug() << "reply 错误：" << reply->errorString();
        reply->deleteLater();
        return false;
    }
    return true;
}

// 搜索歌曲
void SearchManager::searchSongs(const QString &search_text, const callback& cb, int limit, int offset) const
{
    if(search_text.size() == 0) {qDebug() << "search_text is empty"; cb(nullptr); return;}
    QString urlStr = "https://music.163.com/api/search/get/web?s=" + search_text
                   + "&type=1&limit=" + QString::number(limit) + "&offset=" + QString::number(offset);
    search(urlStr, cb);
}

// 搜索专辑
void SearchManager::searchAlbum(int album_id, const SearchManager::callback &cb) const
{
    if(album_id == 0) {qDebug() << "album_id == 0"; cb(nullptr); return;}
    QString albumUrl = "https://music.163.com/api/album/" + QString::number(album_id);
    search(albumUrl, cb);
}

// 搜索图片
void SearchManager::searchImage(const QString& image_url, const SearchManager::callback &cb) const
{
    if(image_url.isEmpty() || image_url.isNull()) { qDebug() << "image_url为空"; return; }
    search(image_url, cb);
}

// 搜索歌词
void SearchManager::searchLrc(qint64 song_id, const callback& cb) const
{
    QString urlStr = "https://music.163.com/api/song/lyric?id=" + QString::number(song_id) + "&lv=1&kv=1&tv=1";
    search(urlStr, cb);
}

// 如果重定向后的结果不为空或404,证明歌曲可以正常播放
// 不需要记录重定向后的地址：
// 1.QMediaPlayer自己会处理重定向
// 2.重定向的地址好像每秒都会变
void SearchManager::checkUrl(const QString &song_url, const SearchManager::callback &cb) const
{
    QNetworkRequest request;
    request.setUrl(song_url);

    QNetworkReply* reply = _manager->get(request);
    connect(reply, &QNetworkReply::finished, this, [reply, cb]()
    {
        if(checkReply(reply) == false) cb(0);
        else
        {
            QUrl songUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
            if(songUrl.isEmpty() || songUrl == QUrl("http://music.163.com/404")) cb(0);
            else cb(QByteArray("true"));
            reply->deleteLater();
        }
    });
}

// 搜索
void SearchManager::search(const QString& urlStr, const callback& cb) const
{
    QUrl url(urlStr);
    QNetworkRequest request;
    request.setUrl(url);

    QNetworkReply* reply = _manager->get(request);

    connect(reply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),
            [](QNetworkReply::NetworkError error) {
        if (error == QNetworkReply::SslHandshakeFailedError) {
            qDebug() << "SSL Handshake failed!";
        } else {
            qDebug() << "Network error:" << error;
        }
    });

    connect(reply, &QNetworkReply::finished, this, [reply, cb]()
    {
        if(checkReply(reply) == false) return;
        cb(reply->readAll());
        reply->deleteLater();
    });
}

//C:\Users\23607>ping baidu.com

//正在 Ping baidu.com [39.156.70.37] 具有 32 字节的数据:
//请求超时。
//来自 39.156.70.37 的回复: 字节=32 时间=2784ms TTL=48
//来自 39.156.70.37 的回复: 字节=32 时间=1619ms TTL=48
//来自 39.156.70.37 的回复: 字节=32 时间=2047ms TTL=48

//39.156.70.37 的 Ping 统计信息:
//    数据包: 已发送 = 4，已接收 = 3，丢失 = 1 (25% 丢失)，
//往返行程的估计时间(以毫秒为单位):
//    最短 = 1619ms，最长 = 2784ms，平均 = 2150ms

//C:\Users\23607>ping baidu.com

//正在 Ping baidu.com [39.156.70.37] 具有 32 字节的数据:
//来自 39.156.70.37 的回复: 字节=32 时间=3625ms TTL=48
//请求超时。
//来自 39.156.70.37 的回复: 字节=32 时间=1796ms TTL=48
//请求超时。

//39.156.70.37 的 Ping 统计信息:
//    数据包: 已发送 = 4，已接收 = 2，丢失 = 2 (50% 丢失)，
//往返行程的估计时间(以毫秒为单位):
//    最短 = 1796ms，最长 = 3625ms，平均 = 2710ms

//搜索 :  "内緒のピアス"
//5  的搜索结果忽略, 当前搜索 :  6
//搜索 :  "香椎モイミ"
//5  的搜索结果忽略, 当前搜索 :  7
//6  的搜索结果忽略, 当前搜索 :  7
//5  的搜索结果忽略, 当前搜索 :  7
//5  的搜索结果忽略, 当前搜索 :  7
//搜索 :  "Orangestar"
//搜索 :  "Orangestar"
//5  的搜索结果忽略, 当前搜索 :  8
//搜索 :  "rinri"
//5  的搜索结果忽略, 当前搜索 :  9
//搜索 :  "Orangestar"
//Network error: QNetworkReply::RemoteHostClosedError
//reply 错误： "Connection closed"
//Network error: QNetworkReply::RemoteHostClosedError
//reply 错误： "Connection closed"
//Network error: QNetworkReply::RemoteHostClosedError
//reply 错误： "Connection closed"
//Network error: QNetworkReply::UnknownNetworkError
//reply 错误： "Error while reading: error:140E0197:SSL routines:SSL_shutdown:shutdown while in init"
//Network error: QNetworkReply::UnknownNetworkError
//reply 错误： "Error while reading: error:140E0197:SSL routines:SSL_shutdown:shutdown while in init"
//Network error: QNetworkReply::UnknownNetworkError
//reply 错误： "Error while reading: error:140E0197:SSL routines:SSL_shutdown:shutdown while in init"
//搜索 :  "ピノキオピー"
//UpdateLayeredWindowIndirect failed for ptDst=(1273, 173), size=(1604x1148), dirty=(1616x1160 -6, -6) (参数错误。)
//7  的搜索结果忽略, 当前搜索 :  11
//5  的搜索结果忽略, 当前搜索 :  11
